package com.zhny.sensor.utils;

/**
 * @Auther: zhy
 * @Date: 2019/11/21
 * @Description: GPS信息处理工具
 */
public class GPSUtils {

    /**
     * 赤道半径(单位m)
     */
    private static final  double EARTH_RADIUS = 6371000;

    private static final  double INTEGR_NUM = 10000;

    /**
     * 从字节数组中获取经纬度数据，根据ASCii的格式解析，将度分格式的经纬度转换成dd格式
     *
     * 经纬度格式：
     * 度	    [d]dd.ddddddd
     * 度-分	    [d]ddmm.mmmmmm
     * 度-分-秒	[d]ddmmss.ss
     *
     * 实例：
     *      57°55’56.6″ =57+55/60+56.6/3600=57.9323888888888
     *
     * @param tude 经度或纬度字节数组
     * @return double
     */
    public static double dmParseDd(byte[] tude) {
        System.out.println(ByteUtils.bytesToAddress(tude));

        StringBuffer sb = new StringBuffer();
        // 数据转换
        for (byte b : tude) {
            char charval = (char) b;
            sb.append(charval);
        }
        //协议里面的格式是 dddmm.mmmmm  敏新 2321.26000N  11318.6670E
        //敏新  这里的纬度的前面必须加个0，因为格式为 0ddmm.mmmm
        if(sb.indexOf(".")==4){
            sb= new StringBuffer("0" + sb.toString());
        }
        System.out.println(sb+"   pppppppppppppp");
        double tudeDD = Double.parseDouble(sb.substring(0, 3)) +  Double.parseDouble(sb.substring(3)) / 60;

        return tudeDD;
    }


    /**
     * 判断是够在方圆2km内
     *
     * @param srcLongitude 圆中心经度
     * @param srcLatitude 圆中心纬度
     * @param destLongitude 目标经度
     * @param destLatitude 目标纬度
     * @return boolean
     */
    public static boolean isInRange2km(double srcLongitude, double srcLatitude, double destLongitude, double destLatitude) {
        if (distance(srcLatitude, srcLongitude, destLatitude, destLongitude) > 2000.0d) {
            return false;
        }
        return true;
    }


    /**
     * 判断是够在方圆10km内
     *
     * @param srcLongitude 圆中心经度
     * @param srcLatitude 圆中心纬度
     * @param destLongitude 目标经度
     * @param destLatitude 目标纬度
     * @return boolean
     */
    public static boolean isInRange10km(double srcLongitude, double srcLatitude, double destLongitude, double destLatitude) {
        if (distance(srcLatitude, srcLongitude, destLatitude, destLongitude) > 10000.0d) {
            return false;
        }
        return true;
    }

    /**
     * 这个是计算两个经纬度之间的距离，以米为单位。敏新
     * @param lat1
     * @param lng1
     * @param lat2
     * @param lng2
     * @return
     */
    public static double distance(double lat1, double lng1, double lat2, double lng2) {
        double x1 = Math.cos(lat1) * Math.cos(lng1);
        double y1 = Math.cos(lat1) * Math.sin(lng1);
        double z1 = Math.sin(lat1);
        double x2 = Math.cos(lat2) * Math.cos(lng2);
        double y2 = Math.cos(lat2) * Math.sin(lng2);
        double z2 = Math.sin(lat2);
        double lineDistance =
                Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
        double s = EARTH_RADIUS * Math.PI * 2 * Math.asin(0.5 * lineDistance) / 180;
        System.out.println(Math.round(s * INTEGR_NUM) / INTEGR_NUM);
        return Math.round(s * INTEGR_NUM) / INTEGR_NUM;
    }

    /**
     * 从字节数组中获取经度数据，根据ASCii的格式解析
     *
     * @param tude 经度或纬度字节数组
     * @return double
     */
    public static double getLongitudeFromByte(byte[] tude) {
        StringBuffer sb = new StringBuffer();
        // 数据转换
        for (byte b : tude) {
            char charval = (char) b;
            sb.append(charval);
        }
        double tudeVal = Double.parseDouble(sb.toString());

        return tudeVal;
    }

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

}
